<?php
/***************************************************************************
 *   Copyright (C) 2007 by Andrea Blankenstijn, David Dieulivol            *
 *   darkan9el@gmail.com, daviddieulivol5@hotmail.com                      *
 *                                                                         *
 *   All rights reserved.                                                  *
 *   This work is released under the terms of the New BSD License.         *
 *   See LICENSE.BSD file for licensing details                            *
 ***************************************************************************/
/* * *
 * $Id: adminGallery.class.php 54 2007-10-21 09:48:00Z DarkAn9el $
 * * */

// IDEE: permettre au maximum de méthodes de traiter plusieurs entrées de la BDD
// comme le font addPictures, removeGalleries et removePictures

/**
 * \class AdminGallery
 * \version $Revision: 54 $
 * \date $Date: 2007-10-21 09:48:00 +0000 (Sun, 21 Oct 2007) $
 * \author Andrea Blankenstijn
 * \author David Dieulivol
 * \brief Classe d'administration des galeries
 */
class AdminGallery
{
	private $galleryId;         ///< identifiant de la galerie
	private $pdoProxy;          ///< instance de PdoProxy
	private $tGalleries;        ///< nom de la table galleries avec préfix
	private $tPhotos2Galleries; ///< nom de la table photos2galleries avec préfix

	/**
	 * \brief Constructeur de la classe.
	 * \param[in] $dbh instance PDO
	 */
	public function __construct(PdoProxy $dbh)
	{
		$this->pdoProxy          = $dbh;
		$this->tGalleries        = $dbh->getPrefix() .'galleries';
		$this->tPhotos2Galleries = $dbh->getPrefix() .'photos2galleries';
	}

	/**
	 * \brief Ajoute une nouvelle galerie.
	 *
	 * les arguments $name et $description sont traitées avec trim() et ensuite vérifiés
	 * par empty(), si le retour est FALSE pour l'un des deux, une exception sera lâchée
	 * \param[in] $name nom de la galerie
	 * \param[in] $description description de la galerie
	 * \param[in] $isOnline est-ce que la galerie est mise online ?
	 * \return $lastId identifiant idGalleries de la galerie ajoutée
	 * \exception Exception si un des arguments $name ou $description est vide ou ne contient que des espaces blancs
	 * \exception Exception erreur durant la transaction de la DB
	 */
	public function addGallery($name, $description, $isOnline = FALSE)
	{
		// Suppression des espaces superflus
		$name        = trim($name);
		$description = trim($description);

		if(empty($name) OR empty($description))
		{
			throw new Exception('Des champs n\'ont pas été correctement remplis');
		}
		else
		{
			try
			{
				$this->pdoProxy->getDbh()->beginTransaction();

				$request = $this->pdoProxy->prepare('INSERT INTO `'.$this->tGalleries.'` '.
						'(`idGalleries`, `name`, `description`, `creationDate`, `isOnline`) '.
						'VALUES '.
						'(NULL, :name, :desc, CURRENT_TIMESTAMP, :online);');

				$request->bindValue(':name', $name, PDO::PARAM_STR);
				$request->bindValue(':desc', $description, PDO::PARAM_STR);
				$request->bindValue(':online', $isOnline, PDO::PARAM_INT);

				$request->execute();

				// Récupération de l'ID de la galerie ajoutée
				$query  = $this->pdoProxy->query('SELECT MAX(`idGalleries`) FROM `'.$this->tGalleries.'`;');
				$lastId = $query->fetchColumn();
				$query->closeCursor();

				$this->pdoProxy->getDbh()->commit();
			}
			catch (Exception $e)
			{
				$this->pdoProxy->getDbh()->rollBack();
				throw new Exception('Erreur lors de la mise à jour de la base de données : '. $e->getMessage());
			}
		}

		return $lastId;
	}

	/**
	 * \brief Ajoute des photos à une galerie.
	 * \param[in] $photoIds tableau des identifiants des photos à ajouter
	 * \exception Exception erreur durant la transaction de la DB
	 */
	// TODO: contrôler que les entrées n'existes déjà, pour ne pas avoir de doublons
	private function addPictures(array $photoIds)
	{
		try
		{
			$this->pdoProxy->getDbh()->beginTransaction();

			$request = $this->pdoProxy->prepare('INSERT INTO `'.$this->tPhotos2Galleries.'` (`idPhotos`, `idGalleries`) ' .
					'VALUES (:photo, :gallery);');

			$request->bindParam(':photo', $photoId, PDO::PARAM_INT);
			$request->bindValue(':gallery', $this->galleryId, PDO::PARAM_INT);

			foreach($photoIds as $photoId)
				$request->execute();

			$this->pdoProxy->getDbh()->commit();
		}
		catch (Exception $e)
		{
			$this->pdoProxy->getDbh()->rollBack();
			throw new Exception('Erreur lors de la mise à jour de la base de données : '. $e->getMessage());
		}
	}

	/**
	 * \brief Supprime une ou plusieurs galeries.
	 * \param[in] $ids Identifiant(s) de la ou les galeries à supprimer
	 * \exception Exception erreur durant la transaction de la DB
	 */
	public function removeGalleries(array $ids)
	{
		try
		{
			$this->pdoProxy->getDbh()->beginTransaction();

			$request = $this->pdoProxy->prepare('DELETE FROM `'.$this->tGalleries.'` WHERE `idGalleries`=:id;');
			$request->bindParam(':id', $id, PDO::PARAM_INT);

			foreach($ids as $id)
				$request->execute();

			$this->pdoProxy->getDbh()->commit();
		}
		catch (Exception $e)
		{
			$this->pdoProxy->getDbh()->rollBack();
			throw new Exception('Erreur lors de la mise à jour de la base de données : '. $e->getMessage());
		}
	}

	/**
	 * \brief Supprime des photos d'une galerie.
	 * \param[in] $photoIds tableau des identifiants des photos à supprimer
	 * \exception Exception erreur durant la transaction de la DB
	 */
	private function removePictures(array $photoIds)
	{
		try
		{
			$this->pdoProxy->getDbh()->beginTransaction();

			$request = $this->pdoProxy->prepare('DELETE FROM `'.$this->tPhotos2Galleries.'` WHERE `idPhotos`=:photo AND `idGalleries`=:gallery;');
			$request->bindParam(':photo', $photoId, PDO::PARAM_INT);
			$request->bindValue(':gallery', $this->galleryId, PDO::PARAM_INT);

			foreach($photoIds as $photoId)
				$request->execute();

			$this->pdoProxy->getDbh()->commit();
		}
		catch (Exception $e)
		{
			$this->pdoProxy->getDbh()->rollBack();
			throw new Exception('Erreur lors de la mise à jour de la base de données : '. $e->getMessage());
		}
	}

	/**
	 * \brief Modifie les propriétés d'une galerie.
	 *
	 * \param[in] $galleryId identifiant de la galerie
	 * \param[in] $name nom de la galerie
	 * \param[in] $description description de la galerie
	 * \param[in] $isOnline galerie mis en ligne ou non (0|1)
	 * \param[in] $addPhotos identifiants des photos à ajouter à la galerie (int array)
	 * \param[in] $removePhotos identifiants des photos à supprimer de la galerie (int array)
	 * \exception Exception erreur durant la transaction de la DB
	 */
	public function updateGallery($galleryId, $name = NULL, $description = NULL, $isOnline = NULL, array $addPhotos = NULL, array $removePhotos = NULL)
	{
		$this->galleryId = $galleryId;

		$requestString   = 'UPDATE `'.$this->tGalleries.'` SET ';
		$requestArgs     = array();
		$i               = 0; // compteur pour savoir s'il faut mettre «,» ou non

		if(!empty($name))
		{
			$requestString .= '`name` = :name';
			$i++;
		}

		if(!empty($description))
		{
			if($i>0)
				$requestString .= ', ';
			$requestString .= '`description` = :desc';
			$i++;
		}

		if(!($isOnline === NULL))
		{
			if($isOnline == 0)
			{
				if($i>0)
				{
					$requestString .= ', ';
				}
				$requestString .= '`isOnline` = 0';
				$i++;
			}
			elseif($isOnline > 0)
			{
				if($i>0)
				{
					$requestString .= ', ';
				}
				$requestString .= '`isOnline` = 1';
				$i++;
			}
		}

		// Si $i == 0, aucune modification à appliquer à la galerie, donc ne rien faire
		if($i>0)
		{
			$requestString .= ' WHERE `idGalleries` = :id;';
	
			try
			{
				$this->pdoProxy->getDbh()->beginTransaction();
	
				$request = $this->pdoProxy->prepare($requestString);

				$request->bindValue(':id', $this->galleryId, PDO::PARAM_INT);
				if(!empty($name))          $request->bindValue(':name', $name, PDO::PARAM_STR);
				if(!empty($description))   $request->bindValue(':desc', $description, PDO::PARAM_STR);

				$request->execute($requestArgs);
	
				$this->pdoProxy->getDbh()->commit();
			}
			catch (Exception $e)
			{
				$this->pdoProxy->getDbh()->rollBack();
				throw new Exception('Erreur lors de la mise à jour de la base de données : '. $e->getMessage() .' SQL : '. $requestString);
			}
		}

		if(!empty($addPhotos))
			$this->addPictures($addPhotos, $this->galleryId);

		if(!empty($removePhotos))
			$this->removePictures($removePhotos, $this->galleryId);

		return 0;
	}
}
?>
